home *** CD-ROM | disk | FTP | other *** search
/ 5 Star Games: DOS Edition 2 / 5 Star Games - DOS Edition (1995)(Ready to Run).iso / dbc / mbrun.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-19  |  17.0 KB  |  713 lines

  1. #ifdef __TURBOC__
  2.     #include <conio.h>
  3. #else
  4.     #include <graph.h>
  5. #endif
  6. #include <io.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "db_types.h"
  11. #include "db_conio.h"
  12. #include "db_curs.h"
  13. #include "db_date.h"
  14. #include "db_dos.h"
  15. #include "db_file.h"
  16. #include "db_funcs.h"
  17. #include "db_heap.h"
  18. #include "db_gvar.h"
  19. #include "db_key.h"
  20. #include "db_lsc.h"
  21. #include "db_pswd.h"
  22. #include "db_sets.h"
  23. #include "db_str.h"
  24. #include "db_win.h"
  25. #include "db_mnu.h"
  26. #include "db_man.h"
  27. #include "db_util.h"
  28. #include "db_work.h"
  29.  
  30. typedef struct {
  31.     uchar exeid[9];
  32.     byte deltat;
  33. } default_rec;
  34.  
  35. default_rec def1 = {"öMB.EXE_",150};
  36.  
  37. #define StartName "STARTMB"
  38.  
  39. typedef char titstr[17];
  40. typedef struct savmtyp {
  41.     pathstr savnam;
  42.     byte savno;
  43.     char savprompt[81];
  44.     pathstr savpath;
  45.     struct savmtyp *savprv;
  46. } savmtyp, *savmptr;
  47. typedef struct passwd_rec {
  48.     long recstat;
  49.     char operator[9];
  50.     char sec_code[2];
  51.     byte fill[5];
  52. } passwdrec;
  53.  
  54. #ifdef __TURBOC__
  55.     unsigned _stklen = 0x4000;
  56. #endif
  57.  
  58. bool quit, pathSwap;
  59. byte autom;
  60. byte gb;
  61. byte ctlkey;
  62. int res,loop;
  63. mnufrec dm;
  64. itmtyp tmpitm;
  65. savmptr smc, svm;
  66. string autop;
  67. pathstr savdir, batchloop, tmpfilesdir;
  68.  
  69. void rubpath(void)
  70. {
  71.     string ts;
  72.  
  73.     if ((dm.basewin2 != NULL) && (mpath.x != 0)) {
  74.         fillstr(ts,64,' ');
  75.         writewxy(ts,0,mpath.x,mpath.y,dm.basewin2);
  76.     }
  77. }
  78.  
  79. void datenpath(void)
  80. {
  81.     string ts;
  82.  
  83.     goodwrite = False;
  84.     if ((mdate.x != 0) && (dm.basewin1 != NULL)) {
  85.         if (mdate.m == 0)
  86.             writewxy(datum(ts,sysdate(ts)),0,mdate.x,mdate.y,dm.basewin1);
  87.         else
  88.             writewxy(slash(ts,sysdate(ts)),0,mdate.x,mdate.y,dm.basewin1);
  89.     }
  90.     if ((mpath.x != 0) && (dm.basewin2 != NULL)) {
  91.         rubpath();
  92.         writewxy(datapath,0,mpath.x,mpath.y,dm.basewin2);
  93.     }
  94.     goodwrite = True;
  95.    pathSwap = False;
  96. }
  97.  
  98. void changeto(pathstr newpath, int *res)
  99. {
  100.     *res = (changedir(newpath)) ? 0 : 1;
  101.     if (*res == 0) {
  102.         getcurrentdir(datapath,0);
  103.         pathSwap = True;
  104.     }
  105. }
  106.  
  107. void loadmanual(void)
  108. {
  109.     string nam;
  110.  
  111. #ifndef DEBUG
  112.     strip(nam,dm.mnufnam);
  113.     strcopy(nam,nam,0,strlen(nam)-3);
  114.     strcat(nam,"MAN");
  115.     initmanual(nam);
  116. #endif
  117. }
  118.  
  119. void newload(mnufrec *m, pathstr newmenu)
  120. {
  121.     int i;
  122.     pathstr newnam;
  123.  
  124. #ifndef DEBUG
  125.     strcpy(newnam,newmenu);
  126.     svm = smc;
  127.     smc = db_malloc(sizeof(savmtyp));
  128.     smc->savprv = svm;
  129.     strcpy(smc->savnam,m->mnufnam);
  130.     smc->savno = m->curmnu->mno;
  131.     strcpy(smc->savprompt,m->curitm->prompt);
  132.     if (dm.curitm->selpath[0] != '\0') {
  133.         getcurrentdir(smc->savpath,0);
  134.         changeto(dm.curitm->selpath,&i);
  135.     }
  136.     else {
  137.         i = 0;
  138.         smc->savpath[0] = '\0';
  139.     }
  140.     if (i == 0) {
  141.         disposemnus(&dm);
  142.         strcpy(dm.mnufnam,newnam);
  143.         initmnu(&dm,0,0,OnDisk);
  144.         dispallwin();
  145.         if (dm.curmnu == NULL) {
  146.             if (smc->savpath[0] != '\0')
  147.                 changeto(smc->savpath,&i);
  148.                 strcpy(dm.mnufnam,smc->savnam);
  149.                 initmnu(&dm,0,0,OnDisk);
  150.                 dispallwin();
  151.                 jumptomnu(&dm,smc->savno);
  152.                 do
  153.                     dm.curitm = dm.curitm->nitm;
  154.                 while ((strcmp(smc->savnam,dm.curitm->prompt) != 0) &&
  155.                                 (dm.curitm != dm.curmnu->fitm));
  156.                 db_free(smc);
  157.                 smc = svm;
  158.             }
  159.             else {
  160.                 loadmanual();
  161.                 dspmnu(&dm,dm.curmnu);
  162.             }
  163.         }
  164.         else {
  165.             db_free(smc);
  166.             smc = svm;
  167.             doserr(3,dm.curitm->selpath);
  168.         }
  169.     pathSwap = True;
  170. #endif
  171. }
  172.  
  173. void erasebatch(void)
  174. {
  175.     unlink(batchloop);
  176. }
  177.  
  178. void savemnuchain(void)
  179. {
  180.     bool   tb;
  181.     FILE *sfile;
  182.     pathstr fname;
  183.     string ts;
  184.  
  185. #ifndef DEBUG
  186.     strcpy(fname,"SAVCHAIN.");
  187.     strcat(fname,strcopy(ts,getenvstr(ts,"MBSTN"),0,3));
  188.     sfile = fopen(fname,"wb");
  189.     tb = (bool) (smc != NULL);
  190.     fwrite(datapath,1,sizeof(datapath),sfile);
  191.     fwrite(savdir,1,sizeof(savdir),sfile);
  192.     fwrite(gvar->operator,1,8,sfile);
  193.     fwrite(&gvar->sec,1,1,sfile);
  194.     fwrite(&tb,1,1,sfile);
  195.     if (tb) {
  196.         svm = smc;
  197.         do {
  198.             fwrite(svm,1,sizeof(savmtyp),sfile);
  199.             svm = svm->savprv;
  200.         } while (svm != NULL);
  201.     }
  202.     fclose(sfile);
  203. #endif
  204. }
  205.  
  206. void restoremnuchain(void)
  207. {
  208.     bool tb;
  209.     int i;
  210.     savmptr tsvm;
  211.     FILE *sfile;
  212.     pathstr tfnam;
  213.     string ts;
  214.  
  215. #ifndef DEBUG
  216.     strcpy(tfnam,"SAVCHAIN.");
  217.     strcat(tfnam,strcopy(ts,getenvstr(ts,"MBSTN"),0,3));
  218.     sfile = fopen(tfnam,"rb");
  219.     if (sfile != NULL) {
  220.         fread(datapath,1,sizeof(datapath),sfile);
  221.         fread(savdir,1,sizeof(savdir),sfile);
  222.         fread(gvar->operator,1,8,sfile);
  223.         fread(&gvar->sec,1,1,sfile);
  224.         fread(&tb,1,1,sfile);
  225.         if (tb) {
  226.             do {
  227.                 tsvm = db_malloc(sizeof(savmtyp));
  228.                 fread(tsvm,1,sizeof(savmtyp),sfile);
  229.                 if (smc == NULL)
  230.                     smc = tsvm;
  231.                 else
  232.                     svm->savprv = tsvm;
  233.                 svm = tsvm;
  234.             } while (!db_eof(sfile));
  235.             svm->savprv = NULL;
  236.         }
  237.         fclose(sfile);
  238.         unlink(tfnam);
  239.         if (savdir[0] != '\0') {
  240.             changeto(savdir,&i);  savdir[0] = '\0';
  241.             i = 0;
  242.         }
  243.     }
  244. #endif
  245. }
  246.  
  247. strptr modestr(string sout)
  248. {
  249.     strptr m;
  250.  
  251.     switch (origm) {
  252.         case 0  : m = "BW40"; break;
  253.         case 1  : m = "CO40"; break;
  254.         case 2  : m = "BW80"; break;
  255.         case 3  : m = "CO80"; break;
  256.         case 7  : m = "MONO"; break;
  257.         default : m = NULL; break;
  258.     }
  259.     if (m == NULL)
  260.         sout[0] = '\0';
  261.     else {
  262.         strcpy(sout,"MODE ");
  263.         strcat(sout,m);
  264.     }
  265.     return (sout);
  266. }
  267.  
  268. void dummy_exec(string p, string c)
  269. {
  270.     int i, slen;
  271.     string tts;
  272.  
  273.     strcpy(gvar->reentry,dm.curitm->prompt);
  274.     slen = strlen(gvar->reentry);
  275.     for (i = 0; i < slen; i++) {
  276.         if (gvar->reentry[i] == ' ') gvar->reentry[i] = '¿';
  277.     }
  278.     strconcat(gvar->reentry,dm.mnufnam," -AE",strip(tts,istr(tts,(long) dm.curmnu->mno,3))," ",gvar->reentry,NULL);
  279.     strcpy(gvar->prog,p);
  280.     strcpy(gvar->cmd,c);
  281.     savemnuchain();
  282.     if (dm.curitm->selwait == _YES) exit(98); else exit(99);
  283. }
  284.  
  285. void writebatch(string batchstr, mnufrec *m)
  286. {
  287.     bool wb;
  288.     int p,tslen;
  289.     string ts,tts;
  290.     FILE *batf;
  291.  
  292. #ifndef DEBUG
  293.     wb = False;
  294.     if ((batchloop[0] != '\0') && (batchstr[0] != '\0')) {
  295.         wb = True;
  296.         savemnuchain();
  297.         batf = fopen(batchloop,"wt");
  298.         fprintf(batf,"Echo Off\n");
  299.         strcpy(ts,batchstr);
  300.         while (strlen(ts) > 0) {
  301.             p = strposch(';',ts);
  302.             if (p >= 0) {
  303.                 mirt(tts,(strcopy(tts,ts,0,p)));  strdelete(ts,0,p+1);
  304.             }
  305.             else {
  306.                 mirt(tts,ts);  ts[0] = '\0';
  307.             }
  308.             wb = replmacro(tts);
  309.             fprintf(batf,"%s\n",tts);
  310.         }
  311.         if (wb) {
  312.             modestr(ts); if (ts[0] != '\0') fprintf(batf,"%s\n",ts);
  313.             getcurrentdir(ts,0);
  314.             fprintf(batf,"%s\n",strcopy(tts,ts,0,2));
  315.             strdelete(ts,0,2);
  316.             strcpy(tts,"CD"); fprintf(batf,"%s\n",strcat(tts,ts));
  317.             strcpy(ts,m->curitm->prompt);
  318.             tslen = strlen(ts);
  319.             for (p = 0; p < tslen; p++)
  320.                 if (ts[p] == ' ') ts[p] = '¿';
  321.             if (lcd) strcat(ts," -LCD");
  322.             strip(tts,istr(tts,(long) m->curmnu->mno,3));
  323.             fprintf(batf,"%s.BAT %s -AE%s %s\n",StartName,m->mnufnam,tts,ts);
  324.             fprintf(batf,"cls\n");
  325.             fclose(batf);
  326.         }
  327.     }
  328.     if (wb) {
  329.         closeallwin();
  330.         clrscr();
  331.         exit(0);
  332.     }
  333.     if (batchloop[0] == '\0')
  334.         dberrm(strconcat(ts,LSC_StartVia," \"",StartName,".BAT\".",NULL));
  335. #endif
  336. }
  337.  
  338. void do_proc(int procno, mnufrec *m)
  339. {
  340.     switch (procno) {
  341.         case -1 : break;
  342.     }
  343. }
  344.  
  345. void updpasswords(void)
  346. {
  347.     byte b;
  348.     string ts,cl,tts;
  349.     uchar pic[2];
  350.  
  351. #ifndef DEBUG
  352.     if (gvar->sec > 0) {
  353.         kflush();
  354.         strcpy(ts,"1");
  355.         if (gvar->sec == 9)
  356.             dbgetstr(ts,_Num,LSC_PaswordChoices,"",chstr(pic,Pic_H),"",nocheck,nohelp);
  357.         if (ts[0] == '2')
  358.             updmaster();
  359.         else {
  360.             if (ts[0] == '1') {
  361.                 strconcat(tts,lookalong,";",datapath,NULL);
  362.                 fsearch(ts,"DB_PASW.EXE",tts);
  363.                 pointer2string(tts,dgvar);
  364.                 strconcat(cl,thisprog.fdir," ",recog,tts,NULL);
  365.                 if (ts[0] != '\0') {
  366.                     for (b = 0; b < MaxMnus; b ++) {
  367.                         if ((dm.mat[b] != NULL) && (dm.mat[b]->winp != NULL))
  368.                             closewin(&dm.mat[b]->winp);
  369.                     }
  370.                     clrscr();
  371.                     dummy_exec(ts,cl);
  372.                     clrscr();
  373.                     dispallwin();
  374.                     jumptomnu(&dm,dm.curmnu->mno);
  375.                 }
  376.             }
  377.         }
  378.     }
  379.     else
  380.         dberrm(LSC_LogOn2Update);
  381. #endif
  382. }
  383.  
  384. void do_ctl(mnufrec *m, itmptr itm)
  385. {
  386.     byte b;
  387.     int i;
  388.     string ts,cl,tts;
  389.  
  390.     if ((m->curmnu != NULL) && (itm != NULL)) {
  391.         if (((itm->seltyp==_Boss)||(itm->seltyp==_Cmd)||(itm->seltyp==_Exe)) &&
  392.                 (itm->selpath[0] != '\0')) {
  393.             getcurrentdir(savdir,0); changeto(itm->selpath,&i);
  394.         }
  395.         else {
  396.             savdir[0] = '\0'; i = 0;
  397.         }
  398.         if (i != 0)
  399.             dberrm(DOSErr3);
  400.         else {
  401.             switch (itm->seltyp) {
  402.                 case _Help : itemhelp(m); break;
  403.                 case _Jump : jumptomnu(m,(byte) ival(itm->selact)); break;
  404.                 case _Run : newload(m,itm->selact); break;
  405.                 case _SetP :
  406.                     rubpath();
  407.                     editdatapath();
  408.                     pathSwap = True;
  409.                 break;
  410.                 case _Log  :
  411.                     logon();
  412.                     for (b = 0; b < MaxMnus; b++) {
  413.                         if ((m->mat[b] != NULL) && (m->mat[b]->winp != NULL)) {
  414.                             zapmnu(m,m->mat[b]);
  415.                             dspmnu(m,m->mat[b]);
  416.                         }
  417.                     }
  418.                 break;
  419.                 case _UpdPW : updpasswords(); break;
  420.                 case _Menu :
  421.                     if ((ival(itm->selact) > 0) && (m->mat[(int) ival(itm->selact)-1] != NULL)) {
  422.                         if (m->mat[(int) ival(itm->selact)-1]->winp != NULL)
  423.                             jumptomnu(m,(byte) ival(itm->selact));
  424.                         else {
  425.                             m->mat[(int) ival(itm->selact)-1]->pmnu = m->curmnu->mno;
  426.                             m->curmnu = m->mat[(int) ival(itm->selact)-1];
  427.                             dspmnu(m,m->curmnu);
  428.                             m->curitm = m->curmnu->litm;
  429.                             m->level = 0;
  430.                         }
  431.                     }
  432.                 break;
  433.                 case _Boss :
  434.                     strconcat(tts,lookalong,";",datapath,NULL);
  435.                     fsearch(ts,strip(ts,itm->selact),tts);
  436.                     if (ts[0] == '\0')
  437.                         strcpy(ts,"NOTFOUND.EXE");
  438.                     if (*(strip(tts,itm->selcmd)) != '\0')
  439.                         strconcat(cl,datapath," ",trim(tts,itm->selcmd),NULL);
  440.                     else
  441.                         strip(cl,datapath);
  442.                     strconcat(cl,cl," ",recog,pointer2string(tts,dgvar),NULL);
  443.                     if (lcd) strcat(cl," -LCD");
  444.                     if (!ehk) strcat(cl," -K");
  445.                     if (replmacro(cl)) {
  446.                         for (b = 0; b < MaxMnus; b++) {
  447.                             if ((m->mat[b] != NULL) && (m->mat[b]->winp != NULL))
  448.                                 closewin(&m->mat[b]->winp);
  449.                         }
  450.                         clrscr();
  451.                         dummy_exec(ts,cl);
  452.                         clrscr();
  453.                         dispallwin();
  454.                         jumptomnu(m,m->curmnu->mno);
  455.                     }
  456.                 break;
  457.                 case _WriteBat : writebatch(itm->selact,m); break;
  458.                 case _Exe :
  459.                 case _Cmd :
  460.                 case _Dos :
  461.                     exitcode = ' ';
  462.                     if ((*strip(tts,itm->selact) == '\0') || (strposch('*',itm->selact) >= 0) ||
  463.                             (strposch('?',itm->selact) >= 0)) {
  464.                         if (itm->seltyp != _Dos) {
  465.                             if ((strposch('*',itm->selact) >= 0) || (strposch('?',itm->selact) >= 0))
  466.                                 dirpick(ts,itm->selact,DirIncl,DirExcl,0,0);
  467.                             else
  468.                                 dirpick(ts,"*.EXE,*.COM,*.BAT",DirIncl,DirExcl,0,0);
  469.                         }
  470.                         else
  471.                             ts[0] = '\0';
  472.                     }
  473.                     else
  474.                         strip(ts,itm->selact);
  475.                     if ((itm->seltyp != _Dos) && (ts[0] != '\0')) {
  476.                         strconcat(tts,lookalong,";",datapath,NULL);
  477.                         fsearch(ts,ts,tts);
  478.                         if (ts[0] == '\0')
  479.                             strip(ts,itm->selact);
  480.                     }
  481.                     getcline(cl,itm->seltyp,ts,itm->selcmd);
  482.                     if (replmacro(cl)) {
  483.                         if ((ts[0] != '\0') && (exitcode != QitKey)) {
  484.                             for (b = 0; b < MaxMnus; b++) {
  485.                                 if ((m->mat[b] != NULL) && (m->mat[b]->winp != NULL))
  486.                                     closewin(&m->mat[b]->winp);
  487.                             }
  488.                             clrscr();
  489.                             dummy_exec(ts,cl);
  490.                             clrscr();
  491.                             dispallwin();
  492.                             jumptomnu(m,m->curmnu->mno);
  493.                         }
  494.                     }
  495.                 break;
  496.                 case _OShell :
  497.                     for (b = 0; b < MaxMnus; b++) {
  498.                         if ((m->mat[b] != NULL) && (m->mat[b]->winp != NULL))
  499.                             closewin(&m->mat[b]->winp);
  500.                     }
  501.                     clrscr();
  502.                     cwrite("\r\n"); cwrite(_ShellMsge); cwrite("\r\n");    cwrite("\r\n");
  503.                     dummy_exec(getenvstr(ts,"COMSPEC"),"");
  504.                     clrscr();
  505.                     dispallwin();
  506.                     jumptomnu(m,m->curmnu->mno);
  507.                 break;
  508.                 case _Proc : do_proc((int) ival(itm->selact),m); break;
  509.                 case _Quit : quit = True; break;
  510.             }
  511.             if (savdir[0] != '\0') {
  512.                 changeto(savdir,&i);
  513.                 savdir[0] = '\0'; i = 0;
  514.             }
  515.         }
  516.     }
  517. }
  518.  
  519. bool initdbm(void)
  520. {
  521.     int i,slen;
  522.     string ts;
  523.     pathstr menspec;
  524.     findrec s;
  525.  
  526.     smc = NULL;
  527.     autom = 0; autop[0] = '\0';
  528.     get_pat_n_nam(dm.mnufnam,MnuExt);
  529.     restoremnuchain();
  530.     for (i = 1; i < paramcount(); i++) {
  531.         if (strposstr("-AE",paramstr(i)) == 0) {
  532.             autom = (byte) ival(strcopy(ts,paramstr(i),3,strlen(paramstr(i))-3));
  533.             if (i < paramcount()-1) strcpy(autop,paramstr(i+1));
  534.         }
  535.     }
  536.     slen = strlen(autop);
  537.     for (i = 0; i < slen ; i++)
  538.         if (autop[i] == 0xA8) autop[i] = ' ';
  539.     if (!exists(dm.mnufnam)) {
  540.         autom = 0; autop[0] = '\0';
  541.         strcpy(ts,datapath);
  542.         slen = strlen(ts);
  543.         if (ts[slen-1] == '\\')
  544.             ts[slen-1] = '\0';
  545.             strconcat(menspec,ts,"\\*",MnuExt,NULL);
  546.             if (db_findfirst(menspec,&s,A_ANYFILE)) {
  547.             strconcat(dm.mnufnam,ts,"\\",s.name,NULL);
  548.             if (db_findnext(&s)) {
  549.                 dirpick(ts,menspec,DirIncl,DirExcl,0,0);
  550.                 strip(dm.mnufnam,ts);
  551.             }
  552.         }
  553.     }
  554.     initmnu(&dm,0,0,OnDisk);
  555.     return ((bool) (dm.curmnu != NULL));
  556. }
  557.  
  558. void main(void)
  559. {
  560.     string ts;
  561.     uchar def[2],pic[2];
  562.  
  563.     db_curs_init();
  564.     db_date_init();
  565.     db_funcs_init();
  566.     db_heap_init();
  567.     db_gvar_init();
  568.     if (i_alloc) exit(0);
  569.     db_key_init();
  570.     db_pswd_init();
  571.     db_win_init();
  572.     db_mnu_init();
  573.     db_man_init();
  574.     db_util_init();
  575.      if (!dbcaller) {
  576.             clrscr();
  577.             cwrite(LSC_StartVia);
  578.             cwrite(" STARTMB.BAT");
  579.             cwrite("\r\n");
  580.             exit(1);  /* Must be run by MB.EXE via STARTMB.BAT */
  581.    }
  582.     initedit();
  583.     deltas = def1.deltat;
  584.   savdir[0] = '\0';
  585.     getenvstr(tmpfilesdir,"ESPATH");
  586.   if (empty(tmpfilesdir) || (!path_ok(tmpfilesdir)))
  587.     strcpy(tmpfilesdir,thisprog.fdir);
  588.   pathSwap = True;
  589.     strconcat(batchloop,"_",strcopy(ts,getenvstr(ts,"MBSTN"),0,3),"LOOP.BAT",NULL);
  590.     set_addmember(ExitSet,AltX);
  591.     if (initdbm()) {
  592.         loadmanual();
  593.         clrscr();
  594.         dispallwin();
  595.         quit = False;
  596.         if (autom != 0) {
  597.             jumptomnu(&dm,autom);
  598.             do
  599.                 dm.curitm = dm.curitm->nitm;
  600.             while ((strcmp(autop,dm.curitm->prompt) != 0) && (dm.curitm != dm.curmnu->fitm));
  601.         }
  602.         else
  603.             dspmnu(&dm,dm.curmnu);
  604.         do {
  605.          if (pathSwap) datenpath();
  606.             if (dm.curitm->sec > gvar->sec) {
  607.                 if (dm.curmnu->mtyp == Vert) goud(&dm,Down); else gorl(&dm,Right);
  608.             }
  609.             hbar(&dm);
  610.             while (!kpressed()) {
  611.                 if (mtime.x != 0)    writewxy(get_time(ts,mtime.m),0,mtime.x,mtime.y,NULL);
  612.                 if (mksta.x != 0)    writewxy(keystat(ts,0),0,mksta.x,mksta.y,NULL);
  613.             }
  614.             ctlkey = upperch(getkey());
  615.             if ((dm.curitm->sec > gvar->sec) &&
  616.                     ((ctlkey != AltX) && (ctlkey != AltL) && (ctlkey != QitKey)))
  617.                 dberrm(LSC_MustLogOn);
  618.             if (((ctlkey == DArr) && (!mousekey)) &&
  619.                     ((dm.curmnu->mtyp != Vert) && (dm.curitm->seltyp == _Menu)))
  620.                 ctlkey = Enter;
  621.             if ((ctlkey == QitKey) && (backjump == 0) &&
  622.                     ((dm.curmnu == NULL) || (dm.curmnu->pmnu == 0))) ctlkey = AltX;
  623.             if (set_member(dm.mnualtset,ctlkey))
  624.                 processalt(ctlkey,&dm,do_ctl);
  625.             else switch (ctlkey) {
  626.                 case QitKey  : if (backjump > 0) {
  627.                     jumptomnu(&dm,backjump); backjump = 0;
  628.                 }
  629.                 else if ((dm.curmnu != NULL) && (dm.curmnu->pmnu != 0)) {
  630.                     zapmnu(&dm,dm.curmnu);
  631.                     dm.curmnu->litm = dm.curitm;
  632.                     dm.curmnu = dm.mat[dm.curmnu->pmnu-1];
  633.                     dm.curitm = dm.curmnu->litm;
  634.                     dm.level = 0;
  635.                     if (dm.curmnu->winp == NULL) dspmnu(&dm,dm.curmnu);
  636.                 }    break;
  637.                 case UArr : goud(&dm,Up);    break;
  638.                 case DArr : goud(&dm,Down);  break;
  639.                 case LArr : gorl(&dm,Left);  break;
  640.                 case RArr : gorl(&dm,Right); break;
  641.                 case Enter : if (gvar->sec >= dm.curitm->sec) {
  642.                     if ((backjump > 0) && (dm.curitm->seltyp != _Proc)) backjump = 0;
  643.                     do_ctl(&dm,dm.curitm);
  644.                     if (backjump > 0) {
  645.                         jumptomnu(&dm,backjump); backjump = 0;
  646.                     }
  647.                 }    break;
  648.                 case HlpKey : itemhelp(&dm); break;
  649.                 case Home   : firstitm(&dm); break;
  650.                 case EndKey : lastitm(&dm);  break;
  651.                 case AltV   : setdeltas();   break;
  652.                 case AltX   : quit = True;   break;
  653.                 case AltL   :
  654.                     logon();
  655.                     for (gb = 0; gb < MaxMnus; gb++)
  656.                         if ((dm.mat[gb] != NULL) && (dm.mat[gb]->winp != NULL)) {
  657.                             zapmnu(&dm,dm.mat[gb]); dspmnu(&dm,dm.mat[gb]);
  658.                         }
  659.                 break;
  660.                 case AltU : updpasswords(); break;
  661.                 case AltS :
  662.                     rubpath();
  663.                     editdatapath();
  664.                     pathSwap = True;
  665.                 break;
  666.                 default :
  667.                     if (selitm(ctlkey,&dm)) {
  668.                         hbar(&dm);
  669.                         if ((backjump > 0) && (dm.curitm->seltyp != _Proc)) backjump = 0;
  670.                         do_ctl(&dm,dm.curitm);
  671.                         if (backjump > 0) {
  672.                             jumptomnu(&dm,backjump); backjump = 0;
  673.                         }
  674.                     }
  675.                 break;
  676.             }
  677.             if (quit && (smc != NULL)) {
  678.                 disposemnus(&dm);
  679.                 svm = smc->savprv;
  680.                 strcpy(dm.mnufnam,smc->savnam);
  681.                 if (smc->savpath[0] != '\0') changeto(smc->savpath,&res);
  682.                 initmnu(&dm,0,0,OnDisk); dispallwin();
  683.                 if (dm.curmnu != NULL) {
  684.                     loadmanual();
  685.                     pathSwap = True;
  686.                     jumptomnu(&dm,smc->savno);
  687.                     do
  688.                         dm.curitm = dm.curitm->nitm;
  689.                     while ((strcmp(smc->savprompt,dm.curitm->prompt) != 0) &&
  690.                                     (dm.curitm != dm.curmnu->fitm));
  691.                     quit = False;
  692.                 }
  693.                 db_free(smc); smc = svm;
  694.             }
  695.             if (quit) {
  696.                 dbgetstr(ts,_Ch,LSC_QuitProgram,chstr(def,_YES),chstr(pic,Pic_U),"",chkyesno,nohelp);
  697.                     quit = (bool) ((ts[0] == _YES) && (exitcode != QitKey));
  698.                 }
  699.         } while (!quit);
  700.         disposemnus(&dm);
  701.     }
  702.     else {
  703.         writewxy(centre(ts,LSC_NoMenu,80),15,1,25,NULL);
  704.         delayorkey(2.0);
  705.     }
  706.     erasebatch();
  707.     if (deltas != def1.deltat) {
  708.         def1.deltat = (byte)deltas;
  709.         updexe(def1.exeid,sizeof(def1));
  710.     }
  711.     clrscr(); gotoxy(1,25);
  712. }
  713.